//
//  StatusPictureView.swift
//  SinaWeiBoProject
//
//  Created by 房城鸿 on 15/10/13.
//  Copyright © 2015年 房兰峰. All rights reserved.
//

import UIKit
import SDWebImage

private let HMStatusPictureViewCellId = "HMStatusPictureViewCellId"

//MARK: - 通知常量，常量保存在常量区，所有的常量共享，一定要足够长，可以避免重复
///  选择照片的通知
let HMStatusPictureViewSelectedPhotoNotification = "HMStatusPictureViewSelectedPhotoNotification"
/// 选择照片的indexPath
let HMStatusPictureViewSelectedPhotoIndexPath = "HMStatusPictureViewSelectedPhotoIndexPath"
/// 中等照片的URL
let HMStatusPictureViewSelectedPhotoURLsKey = "HMStatusPictureViewSelectedPhotoURLsKey"

class StatusPictureView: UICollectionView {

    //微博数据 视图模型
    var statusViewModel:StatusViewModel?{
    
        didSet{
            sizeToFit()
            //MARK: ★★★★★-->>>>> 刷新数据
            reloadData()
        }
    }
    
    override func sizeThatFits(size: CGSize) -> CGSize {
       return  calcViewSize()
    }
    
    private func calcViewSize() -> CGSize{
    
        // 1.准备工作 
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        //设置默认大小
        layout.itemSize = CGSize(width: HMStatusPictureItemWith, height: HMStatusPictureItemWith)
        
        //2. 根据图片数量来计算大小 
        let count = statusViewModel?.thumbnailURLs?.count ?? 0
        
        //1.没有图片
        if count == 0{
            return CGSizeZero
        }
        //,--->1张图片
        if count == 1{
            
            //TODO: - 临时缓存一张图片
            var size = CGSize(width: 150, height: 150)
            
            // 判断图片是否已经被正确的缓存 key  是URL 的完整字符串  
            //  将 数组转化为 字符串
            let key = statusViewModel!.thumbnailURLs![0].absoluteString
            
            if let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key){
            
                size = image.size
            }
            // 单独处理 过宽 或者过窄的图片
            size.width = size.width < 40 ? 40 : size.width
            size.width = size.width > 300 ? 300 : size.width
            
            layout.itemSize = size
            return size
        }
        
        // 3.  --->4 张图片
        if count == 4 {
            let w = 2 * HMStatusPictureItemWith + HMStatusPictureItemMargin
            return CGSize(width: w, height: w)
        }
        // 4》其他
        /*
        2 ,3 
        5 ,6
        7 ,8 ,9
        */
        // 计算显示图片的行数
        let row = CGFloat ((count-1) / Int(HMStatusPictureMaxCount) + 1)
        let h = row * HMStatusPictureItemWith + (row - 1) * HMStatusCellMargin
        let w = HMStatusPictureMaxWith
        
        return CGSize(width: w, height: h)
    }

    // 构造函数的调用是底层自动转发的 init()  --> initWithFrame --- initWithFrame:layout
   // 默认的 layout 没有被初始化
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        
        super.init(frame: frame, collectionViewLayout: UICollectionViewFlowLayout())
        
        backgroundColor = UIColor.lightGrayColor()
    
        // 设置布局 的间距
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        layout.minimumInteritemSpacing = HMStatusPictureItemMargin
        layout.minimumLineSpacing = HMStatusPictureItemMargin
        
        // 指定数据源 - 让自己当自己的数据源
        // 1.在自动以 View 中，代码逻辑相对简单，可以考虑自己充当自己的数据源 
        // 2. dataSource & delegate 本事都是弱引用，自己充当自己的代理不会产生循环引用
        // 3, 除了配图视图，自定义 pickerView （省市联动）
        dataSource = self
        delegate = self
        
        // 注册可重用cell 
        registerClass(StatusPictureViewCell.self, forCellWithReuseIdentifier: HMStatusPictureViewCellId)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

extension StatusPictureView: UICollectionViewDataSource ,UICollectionViewDelegate{
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return statusViewModel?.thumbnailURLs?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(HMStatusPictureViewCellId, forIndexPath: indexPath) as! StatusPictureViewCell
        
        cell.imageUrl = statusViewModel!.thumbnailURLs![indexPath.item]
        return cell
    }
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        
        /*
        //调试 起始位置的代码
        let v = UIView(frame: fullScreenRect(indexPath))
        v.backgroundColor = UIColor(white: 0.6, alpha: 0.5)
        UIApplication.sharedApplication().keyWindow?.addSubview(v)
        *//**
        发送通知
        object : 发送的对象，可以传递一个数值，也可以是 “自己”，通过 obj.属性
        userInfo : 可选字典，可以传递多个数值， object 必须有值
        */
        NSNotificationCenter.defaultCenter().postNotificationName(HMStatusPictureViewSelectedPhotoNotification, object: self, userInfo: [HMStatusPictureViewSelectedPhotoIndexPath:indexPath,HMStatusPictureViewSelectedPhotoURLsKey:statusViewModel!.bmiddleURLs!])
    }
    
    func fullScreenRect(indexPath:NSIndexPath) ->CGRect{
        //根据 【缩略图】 “图片” 来计算目标尺寸
        //1. 拿到缩略图
        let key = statusViewModel!.thumbnailURLs![indexPath.item].absoluteString
        //  imageCache 这个是图片的缓存，内部实现的
        let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
        
        //2. 根据图像计算宽高比
        let scale = image.size.height / image.size.width
        let w = UIScreen.mainScreen().bounds.width
        let h = w * scale
        
        //3. 判断高度
        var y = (UIScreen.mainScreen().bounds.height - h) * 0.5
        if y < 0{
            y = 0;
        }
        return CGRect(x: 0, y: y, width: w, height: h)
    }
    
    func screenRect(indexPath:NSIndexPath) ->CGRect{
        //跟踪用户点击位置
        let cell = cellForItemAtIndexPath(indexPath)
        /**
        转换坐标converRect ,每一个视图的 frame 都是相对父视图来定义的
        有的适合，同一个位置，需要知道在其他视图中的对应位置，这个适合，就可以使用 conver 函数
        UIView 本身就遵守了 UICoordinateSpace 协议，该协议提供给了坐标转换的方法
        */
        //转换坐标
       return convertRect(cell!.frame, toCoordinateSpace: UIApplication.sharedApplication().keyWindow!)
    }
    
    
}

class StatusPictureViewCell: UICollectionViewCell {
    
        var imageUrl:NSURL?{
        didSet{
            iconView.sd_setImageWithURL(imageUrl)
            
            // 在设置图像 ULR 的同时，根据图片的扩展名来判断是否是 GIF 
            gifImage.hidden = (imageUrl!.absoluteString as NSString).pathExtension.lowercaseString != "gif"
        }
    }
    
    //MARK: - cell 的构造方法
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        addSubview(iconView)
        iconView.addSubview(gifImage)
        
        iconView.ff_Fill(self)
        gifImage.ff_AlignInner(type: ff_AlignType.BottomRight, referView: iconView, size: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //MARK: - 懒加载
    private lazy var iconView:UIImageView = {
    
        let iv = UIImageView()
        
        iv.contentMode = UIViewContentMode.ScaleAspectFill
        iv.clipsToBounds = true
        return iv
    }()
    // GIF 指示图片
    private lazy var gifImage:UIImageView = UIImageView(image: UIImage(named: "timeline_image_gif"))
    
}

